package demo10.composite.menuiterator;

import java.util.Iterator;
import java.util.Stack;

/**
 * 复合迭代器
 * */
public class CompositeIterator implements Iterator<MenuComponent>  {
	Stack<Iterator<MenuComponent>> stack = new Stack<Iterator<MenuComponent>>();
	   /*
 Stack是一个后进先出（last in first out，LIFO）的堆栈，在Vector类的基础上扩展5个方法而来

E push(E item)   
         把项压入堆栈顶部。   
E pop()   
         移除堆栈顶部的对象，并作为此函数的值返回该对象。   
E peek()   
         查看堆栈顶部的对象，但不从堆栈中移除它。   
boolean empty()   
         测试堆栈是否为空。    
int search(Object o)   
         返回对象在堆栈中的位置，以 1 为基数。 
         
Deque（双端队列）比起Stack具有更好的完整性和一致性，应该被优先使用
Stack本身通过扩展Vector而来，而Vector本身是一个可增长的对象数组,数组（Vector）的最后一位即为Stack的栈顶
pop、peek以及search方法本身进行了同步

push方法调用了父类的addElement方法

empty方法调用了父类的size方法

Vector类为线程安全类

综上，Stack类为线程安全类(多个方法调用而产生的数据不一致问题属于原子性问题的范畴)
Stack并不要求其中保存数据的唯一性，当Stack中有多个相同的item时，调用search方法，只返回与查找对象equal并且离栈顶最近的item与栈顶间距离（见源码中search方法说明）
	    * */
	public CompositeIterator(Iterator<MenuComponent> iterator) {
		stack.push(iterator);
	}
   
	@Override
	public MenuComponent next() {
		if (hasNext()) {
			Iterator<MenuComponent> iterator = stack.peek();
			MenuComponent component = iterator.next();
			stack.push(component.createIterator());
			return component;
		} else {
			return null;
		}
	}
  
	@Override
	public boolean hasNext() {
		if (stack.empty()) {
			return false;
		} else {
			Iterator<MenuComponent> iterator = stack.peek();
			if (!iterator.hasNext()) {
				stack.pop();
				return hasNext();
			} else {
				return true;
			}
		}
	}
	
	/*
	 * java 8不需要
	 * 
	 * (non-Javadoc)
	 * @see java.util.Iterator#remove()
	 */
	@Override
	public void remove() {
		throw new UnsupportedOperationException();
	}
	

}
